#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <pthread.h>
 
using namespace std;
 
int tickets = 1000;
 
//全局初始化
//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
pthread_mutex_t mutex;//锁的声明
 
void *startRoutine(void *args)
{
    const char* name = static_cast<const char *>(args);
 
    while(true)
    {
        pthread_mutex_lock(&mutex);//如果申请不到就会阻塞线程
        if(tickets > 0)
        {
            usleep(1000);
            cout<<name<<" 抢到了一张票，票的编号是...."<< tickets << endl;
            tickets--;
            pthread_mutex_unlock(&mutex);
            usleep(321);//其实业务
        }
        else
        {
            cout<<name<<" 没有抢到票,没有票了............"<< tickets << endl;
            pthread_mutex_unlock(&mutex);
            break;
        }
    }
    return nullptr;
}
 
int main()
{
    pthread_mutex_init(&mutex,nullptr);
    pthread_t tid1,tid2,tid3,tid4;
 
    pthread_create(&tid1,nullptr,startRoutine,(void*)"thread 1");
    pthread_create(&tid2,nullptr,startRoutine,(void*)"thread 2");
    pthread_create(&tid3,nullptr,startRoutine,(void*)"thread 3");
    pthread_create(&tid4,nullptr,startRoutine,(void*)"thread 4");
 
 
 
    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);
    pthread_join(tid3,nullptr);
    pthread_join(tid4,nullptr);
 
    pthread_mutex_destroy(&mutex);
 
 
 
    return 0;
}

// #include <iostream>
// #include <string>
// #include <pthread.h>
// #include <unistd.h>
// #include <mutex>

// using namespace std;

// //定义一个条件变量
// pthread_cond_t cond;
// //定义一个互斥锁
// pthread_mutex_t mutex_ = PTHREAD_MUTEX_INITIALIZER;

// void *waitCommand(void* args)
// {
//     string name = static_cast<const char*>(args);
//     while(true)
//     {
//         //让对应的线程进行等待  等待被唤醒
//         //三个线程 都会在条件变量下进行排队
//         pthread_cond_wait(&cond,&mutex_);
//         cout<<name<<endl;
//         //cout<<name <<" thread id:"<<pthread_self()<<"run ....." <<endl;
//     }
// }


// int main()
// {
//     pthread_cond_init(&cond,nullptr);
//     pthread_t t1,t2,t3;
//     pthread_create(&t1,nullptr,waitCommand,(void*)"我是线程A");
//     pthread_create(&t2,nullptr,waitCommand,(void*)"我是线程B");
//     //pthread_create(&t3,nullptr,waitCommand,(void*)"thread 3");

//     while(true)
//     {
//         char n = 'a'; 
//         cout <<"请输入你的command(n/q): ";
//         cin >> n;
//         if(n == 'n') 
//             pthread_cond_signal(&cond);
//         else 
//             break;        
//         //sleep(1);
//     }

//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     //pthread_join(t3,nullptr);
//     pthread_cond_destroy(&cond);
//     return 0;
// }
